home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Applications / NIH Image 1.62b11 / Macros / Video < prev   
Text File  |  1997-03-18  |  8KB  |  332 lines

  1. var
  2.    n:integer;  {Global variable used by integration macros}
  3.  
  4.  
  5. macro 'Print Video using TV-3 [P]';
  6. begin
  7.   CallExport('TV-3 Module');
  8. end;
  9.  
  10.  
  11. procedure ExtractEvenField(NewWindow:boolean);
  12. {
  13. Replaces odd scan lines with average of neighboring even lines. Can be used to improve the quality of images that have even and odd fields that are out of sync as the result of subject movement during capture.
  14. }
  15. var
  16.   i,width,height,row1,row2:integer;
  17. begin
  18.   SaveState;
  19.   if NewWindow then Duplicate('Even Field');
  20.   GetPicSize(width,height);
  21.   row1:=0; row2:=0;
  22.   for i:=1 to height/2 do begin
  23.     GetRow(0,row1,width);
  24.     PutRow(0,row2,width);
  25.     row1:=row1+2;
  26.     row2:=row2+1;
  27.   end;
  28.   MakeRoi(0,0,width,height/2);
  29.   Copy;
  30.   MakeRoi(0,height/4-1,width,height/2);
  31.   Paste;
  32.   RestoreRoi;
  33.   SetScaling('Bilinear; Same Window');
  34.   ScaleAndRotate(1,2,0);
  35.   RestoreState;
  36. end;
  37.  
  38. macro 'Extract Even Field->New Window';
  39. begin
  40.   ExtractEvenField(true);
  41. end;
  42.  
  43. macro 'Extract Even Field->Same Window';
  44. begin
  45.   ExtractEvenField(false);
  46. end;
  47.  
  48.  
  49. macro 'Camera and Light Source Test…';
  50.   {Test cameras and light sources for temporal stability.}
  51.   {Maximum rate is about 2 frames/sec.}
  52. var
  53.   interval: real;
  54.   nFrames,frames: integer;
  55.   ticks,StartTicks,NextTicks: integer;
  56. begin
  57.    ResetCounter;
  58.    nFrames:=trunc(GetNumber('Number of Frames:',10));
  59.    interval:=GetNumber('Interval (seconds):',10);
  60.    ticks := interval*60;
  61.    SetCursor('watch');
  62.    StartTicks := TickCount;
  63.    NextTicks:=StartTicks+ticks;
  64.    frames := 0;
  65.    repeat
  66.       Capture;
  67.       Measure;
  68.       SetCursor('Watch');
  69.       repeat until TickCount>=NextTicks;
  70.                   rUser1[rCount] := TickCount-StartTicks;
  71.       NextTicks := NextTicks+ticks;
  72.       frames := frames + 1;
  73.    until frames=nFrames;
  74. end;
  75.  
  76.  
  77. macro 'Average Frames [F]';
  78. begin
  79.   AverageFrames;
  80. end;
  81.  
  82.  
  83. macro 'Average Frames on Trigger';
  84. begin
  85.   WaitForTrigger;
  86.   AverageFrames;
  87. end;
  88.  
  89.  
  90. macro 'Dynamic 1-D Plot';
  91. {
  92. Displays a dynamic 1-d plot of a line in the image while the image
  93. is being captured. You most first create a line selection in
  94. Camera window. The macro works best if you first to a Plot Profile
  95. and move the Plot window so it doesn't cover the Camera window. You
  96. may have to resize the Camera window. Hold down the mouse button
  97. to terminate.
  98. }
  99. var
  100.   x1,y1,x2,y2,LineWidth:integer;
  101. begin
  102.   GetLine(x1,y1,x2,y2,LineWidth);
  103.   if x1=-1 then begin
  104.     PutMessage('Create a straight line selection in the Camera window');
  105.     exit;
  106.   end;
  107.   SetPlotScale(0,255);
  108.   repeat
  109.     Capture;
  110.     if button then exit;
  111.     MakeLineRoi(x1,y1,x2,y2);
  112.     PlotProfile;
  113.   until button;
  114. end;
  115.  
  116.  
  117. macro 'Integrate Inverted…';
  118. {
  119. Inverts captured video to allow more than 128 frames to be
  120. integrated without overflow. For example, the sum of 256 pixels
  121. with an average value of 200(very dark) is 51,200, which is
  122. greater than the 32,767 maximum, but the sum of 256 pixels
  123. with and average value of 55(200 inverted) is 14,080.
  124. }
  125. var
  126.   nFrames:integer;
  127. begin
  128.   nFrames:=GetNumber('Number of Frames:', 200);
  129.   SetVideo('Invert');
  130.   AverageFrames('Integrate', nFrames);
  131.   SetVideo(''); {Don't invert}
  132.   Invert;
  133. end;
  134.  
  135.  
  136. macro 'Acquire AV Video [V]';
  137. begin
  138.    Acquire('Plug-in Digitizer');
  139. end;
  140.  
  141.  
  142. macro 'Acquire AV with Calibration';
  143. {Plug-in Digitiser always calibrates captured images to
  144. 72 dots per inch. To get around this problem, this macro
  145. saves the current spatial scale, calls Plug-in Digitizer 1.1,
  146. and then applies the saved scale to the captured image. The
  147. name used in the Acquire command will have to be changed
  148. if you use a different version of Plug-in Digitizer.
  149. }
  150. var
  151.    scale, AspectRatio:real;
  152.    unit:string;
  153. begin
  154.    GetScale(scale, unit, AspectRatio);
  155.    Acquire('Plug-in Digitizer 1.1');
  156.    SetScale(scale, unit, AspectRatio);
  157. end;
  158.  
  159.  
  160. macro 'Correct Aspect Ratio';
  161. var
  162.    AspectRatio: real;
  163. begin
  164.   AspectRatio := GetNumber('Aspect Ratio:' , 0.95);
  165.   SelectAll;
  166.   SetScaling('Bilinear, Same Window');
  167.   ScaleAndRotate(AspectRatio, 1, 0);
  168. end;
  169.  
  170.  
  171. macro 'Capture with "Live" Histogram';
  172. begin
  173.   StartCapturing;
  174.   ShowHistogram;
  175. end;
  176.  
  177. macro 'Set Offset and gain...';
  178. var
  179.   offset, gain: integer;
  180. begin
  181.   offset := GetNumber('Offset:', get('offset'), 0);;
  182.   gain := GetNumber('Gain:', get('gain'), 0);;
  183.   SetVideo('', gain, offset);
  184. end;
  185.  
  186.  
  187. macro '(-' begin end; {Menu divider}
  188. {
  189. These two macros continuously integrate and display frames either off-chip, using the Scion AG-5, or on-clip, using the Scion LG-3 and a Coho 4910 series camera. Press and hold the mouse button near the top of the Camera window to decrease the number of frames integrated. Press near the bottom to increase the number of frames integrated. Press above or to the left of the Camera window to stop integrating.
  190. }
  191.  
  192. procedure Integrate (mode:string);
  193. var
  194.    x,y,delta:integer;
  195. begin
  196.    if n=0 then n:=6;
  197.    repeat
  198.       if button then begin
  199.          GetMouse(x,y);
  200.          if (x<0) or (y<0) then exit;
  201.          delta:=round(0.333*n);
  202.          if delta<1 then delta:=1;
  203.          if y<220 then begin
  204.             n:=n-delta;
  205.             if n<1 then n:=1;
  206.          end else begin
  207.              n:=n+delta;
  208.              if n>127 then n:=127;
  209.          end;
  210.       end;
  211.       AverageFrames(mode, n);
  212.    until false;
  213. end;
  214.  
  215. macro 'Integrate Using AG-5 [5]';
  216. begin
  217.   Integrate('integrate video rate');
  218. end;
  219.  
  220. macro 'Integrate On-chip Using Cohu [C]';
  221. begin
  222.   Integrate('integrate on-chip');
  223. end;
  224.  
  225.  
  226. macro '(-' begin end; {Menu divider}
  227.  
  228. macro 'Paste Live [L]';
  229. {
  230. Pastes “live” from Camera window into a rectangular
  231. selection in another window. Use Paste Control to
  232. switch to various semi-transparent transfer modes.
  233. }
  234. begin
  235.   PasteLive;
  236. end;
  237.  
  238. macro 'Paste Averaged [A]';
  239. {
  240. Captures an averaged or integrated selection into a window
  241. other than the Camera window. Use in conjunction with "PasteLive". Useful for making montages of different focal
  242. planes of fluorescent specimens.
  243. }
  244. var
  245.   x,y,width,height,pid:integer;
  246. begin
  247.   RequiresVersion(1.53);
  248.   if WindowTitle='Camera' then begin
  249.     PutMessage('The active window cannot be "Camera".');
  250.     exit;
  251.   end;
  252.   GetRoi(x,y,width,height);
  253.    if width=0 then begin
  254.     PutMessage('Rectangular selection required.');
  255.     exit;
  256.   end;
  257.   pid:=PidNumber;
  258.   SelectWindow('Camera');
  259.   MakeRoi(x,y,width,height);
  260.   AverageFrames;
  261.   Copy;
  262.   SelectPic(pid);
  263.   MakeRoi(x,y,width,height);
  264.   Paste;
  265. end;
  266.  
  267. macro 'Paste Live OR [O]';
  268. begin
  269.   PasteLive;
  270.   SetOption; DoOr;
  271. end;
  272.  
  273. macro 'Paste Live XOR [X]';
  274. begin
  275.   PasteLive;
  276.   SetOption; DoXor;
  277. end;
  278.  
  279. macro 'Add Duplicate Slice [D]';
  280. {Use with "Paste Live OR" or "Paste Live XOR"}
  281. {to register series of sections into a stack.}
  282. begin
  283.   SetOption; DoCopy;
  284.   KillRoi;
  285.   SelectAll;
  286.   Copy;
  287.   AddSlice;
  288.   Paste;
  289. end;
  290.  
  291. macro '(-' begin end; {Menu divider}
  292.  
  293. {Note: keyboard shortcuts do not work when the Video}
  294. {Control dialog box is the active window.}
  295.  
  296. macro 'SetChannel 1 [1]'; begin SetChannel(1) end;
  297. macro 'SetChannel 2 [2]'; begin SetChannel(2) end;
  298. macro 'SetChannel 3 [3]'; begin SetChannel(3) end;
  299. macro 'SetChannel 4 [4]'; begin SetChannel(4) end;
  300.  
  301. macro '(-' begin end; {Menu divider}
  302.  
  303. macro 'Generate Pulse Train'
  304. {Outputs a 30Hz pulse train on pin 1(Data Output bit 3)}
  305. {of the Scion LG-3's utility connector.}
  306. var
  307.   NextTicks,inc:integer;
  308. begin
  309.   inc:=1; {1/60 sec.}
  310.   SetCursor('watch');
  311.   NextTicks:=TickCount+inc;
  312.   repeat
  313.     scion[4]:=BitOr(scion[4],8);
  314.     repeat until TickCount>=NextTicks;
  315.     NextTicks:=NextTicks+inc;
  316.     scion[4]:=BitAnd(scion[4],7);
  317.     repeat until TickCount>=NextTicks;
  318.     NextTicks:=NextTicks+inc;
  319.   until button;
  320. end;
  321.  
  322.  
  323. macro 'Set LG-3 DAC A'; begin scion[1]:=GetNumber('DAC A(0-255):',scion[1]); end;
  324. macro 'Set LG-3 DAC B'; begin scion[2]:=GetNumber('DAC B(0-255):',scion[2]); end;
  325. macro 'Set LG-3 Data Out'; begin scion[4]:=GetNumber('Data Out(0-15):',scion[4]); end;
  326. macro 'Read LG-3 Data In'; begin PutMessage('Data In=',BitAnd(scion[3],15):1); end;
  327.  
  328.  
  329.  
  330.  
  331.  
  332.